2.6 switch语句¶
switch语句¶
1. 例子:统计每个元音字母的数量¶
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while (cin >> ch) {
switch (ch) {
case 'a':
++aCnt;
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
}
}
2. case标签¶
case标签必须是整型常量表达式
任意两个case标签的值不能相同
如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,直到遇到break语句
可以把多个case标签写在同一行内,强调这些case表示的是某个范围内的值
// 统计元音字母出现次数
unsigned vowelCnt = 0;
char ch;
while (cin >> ch) {
switch (ch) {
case 'a': case 'e': case 'i': case 'o': case 'u':
++vowelCnt;
break;
}
}
3. break¶
一般不要省略case分支最后的break语句,如果没写break语句,最好加一段注释说明程序的逻辑,否则可能带来非预期的结果。
4. default标签¶
Tips:标签不应该孤零零存在,它后面必须跟上一条语句或者另外一个case标签。如果switch结构以一个空的default标签作为接受,则该default标签后面必须跟上一条空语句或者一个空块。
如果没有任何一个case标签能匹配上switch表达式的值,那么程序将执行紧跟在default标签后面的语句:
// 统计元音字母和非元音字母出现次数
unsigned vowelCnt = 0;
unsigned otherCnt = 0;
char ch;
while (cin >> ch) {
switch (ch) {
case 'a': case 'e': case 'i': case 'o': case 'u':
++vowelCnt;
break;
default:
++otherCnt;
break;
}
}
4. switch内部的变量定义¶
switch的执行流程中可能会跨过某些case标签,如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而保证后面所有case标签都在变量的作用域之外:
case true:
{
string file_name = get_file_name();
}
break;
case false:
// 编译报错: file_name不在作用域之内
if (file_name.empty())